@@ -240,7 +240,7 @@ module Agents |
||
240 | 240 |
when 'subject' |
241 | 241 |
value.present? or next true |
242 | 242 |
re = Regexp.new(value) |
243 |
- if m = re.match(mail.subject) |
|
243 |
+ if m = re.match(mail.scrubbed(:subject)) |
|
244 | 244 |
m.names.each { |name| |
245 | 245 |
matches[name] = m[name] |
246 | 246 |
} |
@@ -252,7 +252,7 @@ module Agents |
||
252 | 252 |
value.present? or next true |
253 | 253 |
re = Regexp.new(value) |
254 | 254 |
matched_part = body_parts.find { |part| |
255 |
- if m = re.match(part.decoded) |
|
255 |
+ if m = re.match(part.scrubbed(:decoded)) |
|
256 | 256 |
m.names.each { |name| |
257 | 257 |
matches[name] = m[name] |
258 | 258 |
} |
@@ -285,7 +285,7 @@ module Agents |
||
285 | 285 |
|
286 | 286 |
if matched_part |
287 | 287 |
mime_type = matched_part.mime_type |
288 |
- body = matched_part.decoded |
|
288 |
+ body = matched_part.scrubbed(:decoded) |
|
289 | 289 |
else |
290 | 290 |
mime_type = 'text/plain' |
291 | 291 |
body = '' |
@@ -295,7 +295,7 @@ module Agents |
||
295 | 295 |
|
296 | 296 |
create_event :payload => { |
297 | 297 |
'folder' => mail.folder, |
298 |
- 'subject' => mail.subject, |
|
298 |
+ 'subject' => mail.scrubbed(:subject), |
|
299 | 299 |
'from' => mail.from_addrs.first, |
300 | 300 |
'to' => mail.to_addrs, |
301 | 301 |
'cc' => mail.cc_addrs, |
@@ -504,6 +504,15 @@ module Agents |
||
504 | 504 |
|
505 | 505 |
attr_reader :uid, :folder, :uidvalidity |
506 | 506 |
|
507 |
+ module Scrubbed |
|
508 |
+ def scrubbed(method) |
|
509 |
+ (@scrubbed ||= {})[method.to_sym] ||= |
|
510 |
+ __send__(method).scrub { |bytes| "<#{bytes.unpack('H*')[0]}>" } |
|
511 |
+ end |
|
512 |
+ end |
|
513 |
+ |
|
514 |
+ include Scrubbed |
|
515 |
+ |
|
507 | 516 |
def initialize(client, fetch_data, props = {}) |
508 | 517 |
@client = client |
509 | 518 |
props.each { |key, value| |
@@ -538,9 +547,14 @@ module Agents |
||
538 | 547 |
mail.all_parts |
539 | 548 |
else |
540 | 549 |
[mail] |
541 |
- end.reject { |part| |
|
542 |
- part.multipart? || part.attachment? || !part.text? || |
|
543 |
- !mime_types.include?(part.mime_type) |
|
550 |
+ end.select { |part| |
|
551 |
+ if part.multipart? || part.attachment? || !part.text? || |
|
552 |
+ !mime_types.include?(part.mime_type) |
|
553 |
+ false |
|
554 |
+ else |
|
555 |
+ part.extend(Scrubbed) |
|
556 |
+ true |
|
557 |
+ end |
|
544 | 558 |
} |
545 | 559 |
end |
546 | 560 |
|
@@ -36,8 +36,12 @@ describe Agents::ImapFolderAgent do |
||
36 | 36 |
all_parts.find { |part| |
37 | 37 |
part.mime_type == type |
38 | 38 |
} |
39 |
- }.compact |
|
39 |
+ }.compact.map! { |part| |
|
40 |
+ part.extend(Agents::ImapFolderAgent::Message::Scrubbed) |
|
41 |
+ } |
|
40 | 42 |
end |
43 |
+ |
|
44 |
+ include Agents::ImapFolderAgent::Message::Scrubbed |
|
41 | 45 |
} |
42 | 46 |
|
43 | 47 |
@mails = [ |
@@ -255,4 +259,29 @@ describe Agents::ImapFolderAgent do |
||
255 | 259 |
end |
256 | 260 |
end |
257 | 261 |
end |
262 |
+ |
|
263 |
+ describe 'Agents::ImapFolderAgent::Message::Scrubbed' do |
|
264 |
+ before do |
|
265 |
+ @class = Class.new do |
|
266 |
+ def subject |
|
267 |
+ "broken\xB7subject\xB6" |
|
268 |
+ end |
|
269 |
+ |
|
270 |
+ def body |
|
271 |
+ "broken\xB7body\xB6" |
|
272 |
+ end |
|
273 |
+ |
|
274 |
+ include Agents::ImapFolderAgent::Message::Scrubbed |
|
275 |
+ end |
|
276 |
+ |
|
277 |
+ @object = @class.new |
|
278 |
+ end |
|
279 |
+ |
|
280 |
+ describe '#scrubbed' do |
|
281 |
+ it 'should return a scrubbed string' do |
|
282 |
+ expect(@object.scrubbed(:subject)).to eq("broken<b7>subject<b6>") |
|
283 |
+ expect(@object.scrubbed(:body)).to eq("broken<b7>body<b6>") |
|
284 |
+ end |
|
285 |
+ end |
|
286 |
+ end |
|
258 | 287 |
end |